﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;

namespace ProjetGenGui
{
    public class Cl_decode
    {
        /// <summary>
        /// Clé utilisée pour le décriptage
        /// </summary>
        public int cle { get; set; }
        /// <summary>
        /// Texte décodé
        /// </summary>
        public string text { get; set; }
        /// <summary>
        /// Pourcentage de mot présent dans le dico
        /// </summary>
        public float pourcent { get; set; }
        /// <summary>
        /// texte à décoder
        /// </summary>
        public string enchantillon { get; set; }
        /// <summary>
        /// Type de décryptage à utiliser (Xor, Cesar)
        /// </summary>
        public string methode { get; set; }

        /// <summary>
        /// Liste des resultats de mot dans le dictionnaire par langue
        /// </summary>
        private List<Cl_resultLangue> resultLangues = new List<Cl_resultLangue>(0);

        /// <summary>
        /// Langue à utiliser (dico) 
        /// </summary>
        public string langue { get; set; }

        /// <summary>
        /// Temps d'execution (mm:ss)
        /// </summary>
        public string seconde { get; set; }


        /// <summary>
        /// Permet de decoder échantillon avec methode
        /// </summary>
        /// <returns>this avec texte decodé</returns>
        public Cl_decode decrypterTout()
        {
            if (this.methode == "Cesar")
            {
                this.decoderCesar();
                return this;
            }
            else if (this.methode == "Xor")
            {
                this.decoder();
                return this;
            }
            this.methode = "Inconnu";
            return this;
        }


        /// <summary>
        /// Decode ou coder l'échatillon avec Xor
        /// </summary>
        /// <returns>le pourcentage de fiabilité</returns>
        public float decoder()
        {

            foreach (char c in this.enchantillon)
            {
                 string retour = decripter(c);
                 
                 this.text += retour;
               
            }
            return pourcent;
        }



        /// <summary>
        /// Decoder l'échatillon avec cesar
        /// </summary>
        /// <returns>le pourcentage de fiabilité</returns>
        public float decoderCesar()
        {

            foreach (char c in this.enchantillon)
            {
                this.text += deCesar(c, this.cle);

            }
            return pourcent;
        }


        /// <summary>
        /// Coder échatillon avec césar dans text
        /// </summary>
        public void coderCesar()
        {

            foreach (char c in this.enchantillon)
            {
                this.text += cesar(c, this.cle);

            }
           
            
        }








        /// <summary>
        /// effectue le cesar avec abcdefghijklmnopqrstuvwxyz
        /// </summary>
        /// <param name="code">caractère à décoder</param>
        /// <param name="decalage">decalage à appliquer</param>
        /// <returns>caractère décrypté</returns>
        private string cesar(char code, int decalage)
        {

            string alphabet = "abcdefghijklmnopqrstuvwxyz";
            if (decalage < alphabet.Length)
            {
                int index = alphabet.IndexOf(code);
                if (index >= 0)
                {
                    int apDecalage = index + decalage;
                    if (apDecalage > alphabet.Length-1)
                    {
                        int nvIndex = apDecalage - alphabet.Length;
                        return alphabet[nvIndex].ToString();
                    }
                    else
                    {
                        return alphabet[apDecalage].ToString();
                    }

                }

                return code.ToString();
            }
            return code.ToString();

        }


        /// <summary>
        /// effectue le decryptage d'un cesar avec abcdefghijklmnopqrstuvwxyz
        /// </summary>
        /// <param name="code">caractère à décoder</param>
        /// <param name="decalage">decalage à appliquer</param>
        /// <returns>caractère décrypté</returns>
        private string deCesar(char code, int decalage)
        {

            string alphabet = "abcdefghijklmnopqrstuvwxyz";
            if (decalage < alphabet.Length)
            {
                int index = alphabet.IndexOf(code);
                if (index >= 0)
                {
                    int apDecalage = index - decalage;
                    if (apDecalage < 0)
                    {
                        int nvIndex = apDecalage + alphabet.Length;
                        return alphabet[nvIndex].ToString();
                    }
                    else
                    {
                        return alphabet[apDecalage].ToString();
                    }

                }

                return code.ToString();
            }
            return code.ToString();

        }


        /// <summary>
        /// Réalise le XOR entre le char et la clé
        /// </summary>
        /// <param name="code">char à decoder</param>
        /// <returns>char decodé</returns>
        private string decripter(char code)
        {
            
            int lettre = Convert.ToInt32(code);
            
            try
            {
                int result = lettre ^ int.Parse(this.cle.ToString());
                return char.ConvertFromUtf32(result);
            }
            catch
            {
                //Debug.WriteLine("out");
                this.pourcent = 0;
                return "false";
            }
           
        }



        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="clePara">clé à utiliser</param>
        /// <param name="echantillonPara">texte à décoder</param>
        /// <param name="languePara">langue à utiliser si null pas de recherche dans le dico</param>
        /// <param name="methodePara">Cesar / Xor méthode à utliser pour décoder</param>
        public Cl_decode(int clePara, string echantillonPara, string languePara,string methodePara)
        {
            this.pourcent = 0;
            this.cle = clePara;
            this.enchantillon = echantillonPara;
            this.langue = languePara;
            this.methode = methodePara;
        }
		
        /// <summary>
        /// Constructeur par défaut
        /// </summary>
		 public Cl_decode()
		 {
             this.pourcent = 0;
		 }



       




        

        public string ToString()
        {
            return "############ " + this.enchantillon + " donne retour: " + this.text + " avec la clé " + this.cle + "pourcentage " + this.pourcent;
        }
    }
}